/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "节点/节点.h"

#include "节点/插座/C_物体插座.h"
#include "节点/插座/list/list数值插座.h"





class API_EXPORT C_单值计算节点 : public C_节点基类 {
	
public:
	C_单值计算节点(S_设备环境& ctx);
	~C_单值计算节点();

	S_Props		m_计算方式;
	//S_Props		m_是否改变原数据;
	//S_Props		m_执行代码;

	bool	f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);
	void    f_getStr(std::vector<std::vector<std::u16string>>& 文本);
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	void    f_Copy(const C_节点基类* node);
};

C_节点基类* f_node_创建单值计算节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载单值计算节点(S_设备环境& ctx, FILE* f);
void		f_node_保存单值计算节点(C_节点基类* n, FILE* f);



class API_EXPORT C_组合计算节点 : public C_节点基类 {

public:
	C_组合计算节点(S_设备环境& ctx);
	~C_组合计算节点();

	S_Props		m_计算方式;
	S_Props		m_是否改变原数据;
	//S_Props		m_执行代码;

	bool	f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);
	void    f_getStr(std::vector<std::vector<std::wstring>>& 文本);
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	void    f_Copy(const C_节点基类* node);
};

C_节点基类* f_node_创建组合计算节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载组合计算节点(S_设备环境& ctx, FILE* f);
void		f_node_保存组合计算节点(C_节点基类* n, FILE* f);



class API_EXPORT C_位运算节点 : public C_节点基类 {

public:
	C_位运算节点(S_设备环境& ctx);
	~C_位运算节点();

	S_Props		m_计算方式;
	S_Props		m_是否改变原数据;
	//S_Props		m_执行代码;

	bool	f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);
	void    f_getStr(std::vector<std::vector<std::wstring>>& 文本);
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	void    f_Copy(const C_节点基类* node);
};

C_节点基类* f_node_创建位运算节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载位运算节点(S_设备环境& ctx, FILE* f);
void		f_node_保存位运算节点(C_节点基类* n, FILE* f);



class API_EXPORT C_逻辑计算节点 : public C_节点基类 {

public:
	C_逻辑计算节点(S_设备环境& ctx);
	~C_逻辑计算节点();

	S_Props		m_计算方式;
	S_Props		m_是否改变原数据;

	bool		f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	void    f_Copy(const C_节点基类* node);
};

C_节点基类* f_node_创建逻辑计算节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载逻辑计算节点(S_设备环境& ctx, FILE* f);
void		f_node_保存逻辑计算节点(C_节点基类* n, FILE* f);



class API_EXPORT C_单目计算节点 : public C_节点基类 {

public:
	C_单目计算节点(S_设备环境& ctx);
	~C_单目计算节点();

	S_Props		m_计算方式;
	S_Props		m_改变原数据;

	bool	f_update();
	std::string DEF_节点编译函数;
	void    f_getStr(std::vector<std::vector<std::u16string>>& 文本);
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	void    f_Copy(const C_节点基类* node);
};

C_节点基类* f_node_创建单目计算节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载单目计算节点(S_设备环境& ctx, FILE* f);
void		f_node_保存单目计算节点(C_节点基类* n, FILE* f);




class API_EXPORT C_累计计算节点 : public C_节点基类 {

public:
	C_累计计算节点(S_设备环境& ctx);
	~C_累计计算节点();

	S_Props		m_计算方式;
	S_Props		m_累积方式;

	bool	f_update();
	std::string DEF_节点编译函数;
	//void    f_getStr(std::vector<std::vector<std::wstring>>& 文本);
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	void    f_Copy(const C_节点基类* node);
};

C_节点基类* f_node_创建累计计算节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载累计计算节点(S_设备环境& ctx, FILE* f);
void		f_node_保存累计计算节点(C_节点基类* n, FILE* f);




